package br.com.localab.reservaambiente.modelo;

import java.io.Serializable;
import java.util.Date;
import java.util.List;

import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.criterion.Expression;

public class RepositorioReservaAmbiente implements IRepositorioReservaAmbiente, Serializable{

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	private Session s;
	
	public RepositorioReservaAmbiente(Session s) {
		this.s = s;
	}
	
	public void cadastrarReservaAmbiente(ReservaAmbiente reservaAmbiente) throws ReservaAmbienteJaCadastradoException{
		try{
			s.save(reservaAmbiente);
		}catch(Exception e){
		  throw	new ReservaAmbienteJaCadastradoException(reservaAmbiente.getReservaAmbiente_PK().getAmbiente().getAmbiente_PK().getNome());
		}
	}
	
	public void editarReservaAmbiente(ReservaAmbiente reservaAmbiente) throws ReservaAmbienteNaoEncontradoException{
		try{
			s.update(reservaAmbiente);
		}catch(Exception e){
		  throw	new ReservaAmbienteNaoEncontradoException(reservaAmbiente.getReservaAmbiente_PK().getAmbiente().getAmbiente_PK().getNome());
		}
	}
	
	public ReservaAmbiente procurar(ReservaAmbiente_PK reservaAmbiente_PK) throws ReservaAmbienteNaoEncontradoException{
		ReservaAmbiente reservaAmbiente;
		try{
			reservaAmbiente  = (ReservaAmbiente) s.load(ReservaAmbiente.class, reservaAmbiente_PK);
			System.out.println(reservaAmbiente_PK.getAmbiente().getAmbiente_PK().getNome());
		return reservaAmbiente;
		}catch(Exception e){
			throw new ReservaAmbienteNaoEncontradoException(reservaAmbiente_PK.getAmbiente().getAmbiente_PK().getNome());
		}
	}
	
	@SuppressWarnings("unchecked")
	public List<ReservaAmbiente> listar(){
		return s.createCriteria(ReservaAmbiente.class).list();
	}
	
	@SuppressWarnings("unchecked")
	public List<ReservaAmbiente> list(String nomeCampo, boolean valorCampo) {
		Criteria c = s.createCriteria(ReservaAmbiente.class);
		c.add(Expression.eq(nomeCampo, valorCampo));
		c.setCacheable(false);
		return c.list();
	}
	
	public ReservaAmbiente procurar(String nomeCampo, String valorCampo) throws ReservaAmbienteNaoEncontradoException{
		try{
		Criteria c = s.createCriteria(ReservaAmbiente.class);
		c.add(Expression.eq(nomeCampo, valorCampo));
		c.setCacheable(true);
		ReservaAmbiente reservaAmbiente = (ReservaAmbiente) c.uniqueResult();
		System.out.println(reservaAmbiente.getReservaAmbiente_PK().getAmbiente().getAmbiente_PK().getNome());
		return reservaAmbiente;
		}catch(Exception e){
			throw new ReservaAmbienteNaoEncontradoException(valorCampo);
		}
	}

	@Override
	public void removerReservaAmbiente(
			ReservaAmbiente reservaAmbiente)
			throws ReservaAmbienteNaoEncontradoException {
		try{
			s.delete(reservaAmbiente);
		}catch(Exception e){
		  throw	new ReservaAmbienteNaoEncontradoException(reservaAmbiente.getReservaAmbiente_PK().getAmbiente().getAmbiente_PK().getNome());
		}
		
	}

	@Override
	public ReservaAmbiente procurar(String nomeCampo, Date valorCampo,
			String nomeCampo1, Long valorCampo1, String nomeCampo2,
			Long valorCampo2, String nomeCampo3, String valorCampo3) {
		// TODO Auto-generated method stub
		Criteria c = s.createCriteria(ReservaAmbiente.class);
		c.add(Expression.eq(nomeCampo, valorCampo));
		c.add(Expression.eq(nomeCampo1, valorCampo1));
		c.add(Expression.eq(nomeCampo2, valorCampo2));
		c.add(Expression.eq(nomeCampo3, valorCampo3));
		c.setCacheable(true);
		ReservaAmbiente reservaAmbiente = (ReservaAmbiente) c.uniqueResult();
		return reservaAmbiente;
	}

	
}
